{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Copyright 2018 IBM All Rights Reserved.\n",
    "#\n",
    "# Licensed under the Apache License, Version 2.0 (the \"License\");\n",
    "# you may not use this file except in compliance with the License.\n",
    "# You may obtain a copy of the License at\n",
    "#\n",
    "#      http://www.apache.org/licenses/LICENSE-2.0\n",
    "#\n",
    "# Unless required by applicable law or agreed to in writing, software\n",
    "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
    "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
    "# See the License for the specific language governing permissions and\n",
    "# limitations under the License."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Recognize and Count Objects in a Video\n",
    "\n",
    "An object detection classifier can be used to identify and locate objects in a static image. When using video, you can use the same approach to static detection individual frames.  In this Jupyter Notebook, we'll use the [IBM PowerAI Vision](https://www.ibm.com/us-en/marketplace/ibm-powerai-vision) for object detection and [OpenCV Python API](https://opencv.org/) to process the video.\n",
    "\n",
    "Before running this notebook, you will need to train and deploy an object detection model. PowerAI Vision has auto-labeling to enhance your dataset for accuracy when using video input. After you train and deploy your model, set the `POWER_AI_VISION_API_URL` constant below to use your model for inference.\n",
    "\n",
    "Extracting frames and locating objects is easy with OpenCV and PowerAI Vision. The challenge is how to keep track of objects if you want to count them. As an object moves, you will need to be able to determine whether or not you have already counted the object. In this notebook, we'll use the OpenCV Tracking API to follow cars down the road while we run PowerAI Vision object detection on a sample of the frames. With tracking, we'll be able to avoid double counting without requiring a lot of code.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "| First Detected... | Followed Down the Road |\n",
    "| :---: | :---: |\n",
    "| ![detected](https://raw.githubusercontent.com/IBM/powerai-counting-cars/master/doc/source/images/output-frame_00011.jpg) | ![tracked](https://raw.githubusercontent.com/IBM/powerai-counting-cars/master/doc/source/images/output-frame_00128.jpg) |\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## First setup some parameters\n",
    "\n",
    "### Required setup!\n",
    "\n",
    "Your PowerAI Vision API URL for the model that you trained and deployed will need to be set here."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Set this URL using your PowerAI Vision host + /AIVision/api + your deployed web API URL.\n",
    "POWER_AI_VISION_API_URL = \"https://ny1.ptopenlab.com/AIVision/api/dlapis/your-guid-here\"\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Optional configuration\n",
    "\n",
    "Here you can customize some settings to tune your results.\n",
    "\n",
    "> NOTE: The notebook uses sampling and cached results to speed things up for iterative development. If you change the video, you will need to run with `CLEAN = True` to delete and regenerate your cached frames and inference results!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [],
   "source": [
    "CLEAN = False  # USE WITH CARE! Wipe out saved files when this is true (else reuse for speed)\n",
    "input_video_url = \"https://raw.githubusercontent.com/IBM/powerai-counting-cars/master/data/test_video.mp4\"  # The input video\n",
    "START_LINE = 0  # If start line is > 0, cars won't be added until below the line (try 200)\n",
    "FRAMES_DIR = \"frames\"  # Output dir to hold/cache the original frames\n",
    "OUTPUT_DIR = \"output\"  # Output dir to hold the annotated frames\n",
    "SAMPLING = 10  # Classify every n frames (use tracking in between)\n",
    "CONFIDENCE = 0.80  # Confidence threshold to filter iffy objects\n",
    "\n",
    "# OpenCV colors are (B, G, R) tuples -- RGB in reverse\n",
    "WHITE = (255, 255, 255)\n",
    "YELLOW = (66, 244, 238)\n",
    "GREEN = (80, 220, 60)\n",
    "LIGHT_CYAN = (255, 255, 224)\n",
    "DARK_BLUE = (139, 0, 0)\n",
    "GRAY = (128, 128, 128)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Install Python Requirements\n",
    "\n",
    "Install Python packages from pypi.org.\n",
    "We're pinning versions here to what was last tested.\n",
    "You might want to comment these out after you have the packages, or update the versions if you\n",
    "want to try the latest."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Requirement already satisfied: opencv-python==3.4.4.19 in /anaconda3/lib/python3.6/site-packages\n",
      "Requirement already satisfied: numpy>=1.11.3 in /anaconda3/lib/python3.6/site-packages (from opencv-python==3.4.4.19)\n",
      "\u001b[33mYou are using pip version 9.0.1, however version 18.1 is available.\n",
      "You should consider upgrading via the 'pip install --upgrade pip' command.\u001b[0m\n",
      "Requirement already satisfied: opencv-contrib-python==3.4.4.19 in /anaconda3/lib/python3.6/site-packages\n",
      "Requirement already satisfied: numpy>=1.11.3 in /anaconda3/lib/python3.6/site-packages (from opencv-contrib-python==3.4.4.19)\n",
      "\u001b[33mYou are using pip version 9.0.1, however version 18.1 is available.\n",
      "You should consider upgrading via the 'pip install --upgrade pip' command.\u001b[0m\n",
      "Requirement already satisfied: requests==2.20.1 in /anaconda3/lib/python3.6/site-packages\n",
      "Requirement already satisfied: idna<2.8,>=2.5 in /anaconda3/lib/python3.6/site-packages (from requests==2.20.1)\n",
      "Requirement already satisfied: urllib3<1.25,>=1.21.1 in /anaconda3/lib/python3.6/site-packages (from requests==2.20.1)\n",
      "Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /anaconda3/lib/python3.6/site-packages (from requests==2.20.1)\n",
      "Requirement already satisfied: certifi>=2017.4.17 in /anaconda3/lib/python3.6/site-packages (from requests==2.20.1)\n",
      "\u001b[33mYou are using pip version 9.0.1, however version 18.1 is available.\n",
      "You should consider upgrading via the 'pip install --upgrade pip' command.\u001b[0m\n",
      "Requirement already satisfied: pandas==0.23.4 in /anaconda3/lib/python3.6/site-packages\n",
      "Requirement already satisfied: pytz>=2011k in /anaconda3/lib/python3.6/site-packages (from pandas==0.23.4)\n",
      "Requirement already satisfied: numpy>=1.9.0 in /anaconda3/lib/python3.6/site-packages (from pandas==0.23.4)\n",
      "Requirement already satisfied: python-dateutil>=2.5.0 in /anaconda3/lib/python3.6/site-packages (from pandas==0.23.4)\n",
      "Requirement already satisfied: six>=1.5 in /anaconda3/lib/python3.6/site-packages (from python-dateutil>=2.5.0->pandas==0.23.4)\n",
      "\u001b[33mYou are using pip version 9.0.1, however version 18.1 is available.\n",
      "You should consider upgrading via the 'pip install --upgrade pip' command.\u001b[0m\n",
      "Requirement already satisfied: urllib3==1.24.1 in /anaconda3/lib/python3.6/site-packages\n",
      "\u001b[33mYou are using pip version 9.0.1, however version 18.1 is available.\n",
      "You should consider upgrading via the 'pip install --upgrade pip' command.\u001b[0m\n"
     ]
    }
   ],
   "source": [
    "!pip install opencv-python==3.4.4.19\n",
    "!pip install opencv-contrib-python==3.4.4.19\n",
    "!pip install requests==2.20.1\n",
    "!pip install pandas==0.23.4\n",
    "!pip install urllib3==1.24.1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Warning: Certificates not verified!\n"
     ]
    }
   ],
   "source": [
    "import json\n",
    "import glob\n",
    "import math\n",
    "import os\n",
    "import shutil\n",
    "\n",
    "import cv2\n",
    "from IPython.display import clear_output, Image, display\n",
    "import requests\n",
    "from requests.packages.urllib3.exceptions import InsecureRequestWarning\n",
    "requests.packages.urllib3.disable_warnings(InsecureRequestWarning)\n",
    "print(\"Warning: Certificates not verified!\")\n",
    "\n",
    "%matplotlib notebook\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Download the video\n",
    "This will download a small example video.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--2018-11-28 10:14:23--  https://ibm.box.com/shared/static/4r4tf2robabiqu36ocmykrzvojuse5k9.mp4\n",
      "Resolving ibm.box.com... 107.152.24.197\n",
      "Connecting to ibm.box.com|107.152.24.197|:443... connected.\n",
      "HTTP request sent, awaiting response... 301 Moved Permanently\n",
      "Location: https://ibm.ent.box.com/shared/static/4r4tf2robabiqu36ocmykrzvojuse5k9.mp4 [following]\n",
      "--2018-11-28 10:14:23--  https://ibm.ent.box.com/shared/static/4r4tf2robabiqu36ocmykrzvojuse5k9.mp4\n",
      "Resolving ibm.ent.box.com... 107.152.25.211, 107.152.24.211\n",
      "Connecting to ibm.ent.box.com|107.152.25.211|:443... connected.\n",
      "HTTP request sent, awaiting response... 302 Found\n",
      "Location: https://public.boxcloud.com/d/1/b1!pl42cl_FjOs2huchxt6hWPB3uHlY9mRN5FDK6vqbFLwZfhhb9aNkXuWPwUFA4BYhJ35hQh0NQFYAkaWqWK46upsdTm64ZXSv-pwXlzfNNq4R25MBHBsTtCHSTm7ESDUi4znQXHo1syYMfT59pz3WabsS8M5OA3si3ks4FCNmGdf3ARPUqOqbSGmhVhUTdVCx5y-7Z02ZVqYL9V-JdzK5dNEYnTkCEIFSvqvHEfQ-GEO2g0L95tQgGWiZln1QusKzOvR8SGXSLmOAY9BXsmd9HkskMYWwcEDzDAB8rEXdi9K-H0rqharnkfxyW5w_mWrD1jwyNnoEv7sYeC6-XT5tpopC8krgDKnylej_cGppMpKDhODHyhRLqHXCYJ05RV1F8g74NCLVsFSYnnNguwoZctluvBmZBmoIBPHB72rof7n2qBypuf8CNqNTi9p-iZkgGpM7R8hYHk0x7tk3GmJA6Vp6LYrs3HnSvVpN2jVjf6Yn4xt0Mwp_NyvgFLxgoTu5t21I07uM6iTC78GsZxh1-_1QgQURoi7PlhwxVakqfvxO22rO3Vb_nybcfxHB1vvPM75q8KhgcPvX8pruJg50EnS0HJ0skAlxVb8das1HIVlIk_QsIr4PpzHkAFrASisXA1bp5U9uWR_6_ywyFtsEu40xOV1ZnggCbu9LBW9wt0e3W_Mv96DrlJoNzDlxz0ECjWDVuHlXfWI94R9r39tjUW7O7371o5g_mt5qfRJrTbwgqpZ6IiFp7isXabNaIXr2jogrG6Bw7FatcZVCkVc5yepSqaT1XBSaIAJqiDWZpdzgAtlDU3nUYrL2iTpNwoLUpnYbHF_2h2vsTWg46JI8jQsH4_QkTM-fcFmZyHuukXcU4xf5SHcpUspv2YHr0zEE9izOE3YU0zeKP2ztjCAvADPVp0q4skgr0-LcR1uaCmMLl2qB5GxI3Zcv9hllbCe-sp1welsYBSwwubLk0Dx1OZTgENJkO-T8yBhslyUtq4qyiQ9viau5SO8pImjlkdhC4GZUsduYSTbDUxdkfR-3yfQYuwSL8ekNv9dqu8KrGGice1Qxe3pdkrgonb00_d2L_zu58CgvKonlvOVYr_I5duT552bJWAJF7rFG6iey24EoH34x_BOfeYKJmhV_GvX5nbOIOxZpM1itMmUbP9jnoRlq5eaDb_fuX9Ju-VT2h23cH2xBuNXVzKE9b5wjDQp-DCa9EMbkWAqyNqda78tgGo5eTP5lTIsmAzMF1QKi_7VVqygCZkx85tsLssMffK-N2IlP_rQJCjdvLtkMFajPnuTOEccO6w3-Ba4G3g7kd4OHsYLgUJ6nIRVKUf42AUaZmNQAVeZBEnSaSTyxcjfRVPikhg_lzM8tmA7s_nz-uA../download [following]\n",
      "--2018-11-28 10:14:24--  https://public.boxcloud.com/d/1/b1!pl42cl_FjOs2huchxt6hWPB3uHlY9mRN5FDK6vqbFLwZfhhb9aNkXuWPwUFA4BYhJ35hQh0NQFYAkaWqWK46upsdTm64ZXSv-pwXlzfNNq4R25MBHBsTtCHSTm7ESDUi4znQXHo1syYMfT59pz3WabsS8M5OA3si3ks4FCNmGdf3ARPUqOqbSGmhVhUTdVCx5y-7Z02ZVqYL9V-JdzK5dNEYnTkCEIFSvqvHEfQ-GEO2g0L95tQgGWiZln1QusKzOvR8SGXSLmOAY9BXsmd9HkskMYWwcEDzDAB8rEXdi9K-H0rqharnkfxyW5w_mWrD1jwyNnoEv7sYeC6-XT5tpopC8krgDKnylej_cGppMpKDhODHyhRLqHXCYJ05RV1F8g74NCLVsFSYnnNguwoZctluvBmZBmoIBPHB72rof7n2qBypuf8CNqNTi9p-iZkgGpM7R8hYHk0x7tk3GmJA6Vp6LYrs3HnSvVpN2jVjf6Yn4xt0Mwp_NyvgFLxgoTu5t21I07uM6iTC78GsZxh1-_1QgQURoi7PlhwxVakqfvxO22rO3Vb_nybcfxHB1vvPM75q8KhgcPvX8pruJg50EnS0HJ0skAlxVb8das1HIVlIk_QsIr4PpzHkAFrASisXA1bp5U9uWR_6_ywyFtsEu40xOV1ZnggCbu9LBW9wt0e3W_Mv96DrlJoNzDlxz0ECjWDVuHlXfWI94R9r39tjUW7O7371o5g_mt5qfRJrTbwgqpZ6IiFp7isXabNaIXr2jogrG6Bw7FatcZVCkVc5yepSqaT1XBSaIAJqiDWZpdzgAtlDU3nUYrL2iTpNwoLUpnYbHF_2h2vsTWg46JI8jQsH4_QkTM-fcFmZyHuukXcU4xf5SHcpUspv2YHr0zEE9izOE3YU0zeKP2ztjCAvADPVp0q4skgr0-LcR1uaCmMLl2qB5GxI3Zcv9hllbCe-sp1welsYBSwwubLk0Dx1OZTgENJkO-T8yBhslyUtq4qyiQ9viau5SO8pImjlkdhC4GZUsduYSTbDUxdkfR-3yfQYuwSL8ekNv9dqu8KrGGice1Qxe3pdkrgonb00_d2L_zu58CgvKonlvOVYr_I5duT552bJWAJF7rFG6iey24EoH34x_BOfeYKJmhV_GvX5nbOIOxZpM1itMmUbP9jnoRlq5eaDb_fuX9Ju-VT2h23cH2xBuNXVzKE9b5wjDQp-DCa9EMbkWAqyNqda78tgGo5eTP5lTIsmAzMF1QKi_7VVqygCZkx85tsLssMffK-N2IlP_rQJCjdvLtkMFajPnuTOEccO6w3-Ba4G3g7kd4OHsYLgUJ6nIRVKUf42AUaZmNQAVeZBEnSaSTyxcjfRVPikhg_lzM8tmA7s_nz-uA../download\n",
      "Resolving public.boxcloud.com... 107.152.24.200, 107.152.25.200\n",
      "Connecting to public.boxcloud.com|107.152.24.200|:443... connected.\n",
      "HTTP request sent, awaiting response... 200 OK\n",
      "Length: 8887512 (8.5M) [video/mp4]\n",
      "Saving to: ‘4r4tf2robabiqu36ocmykrzvojuse5k9.mp4.6’\n",
      "\n",
      "4r4tf2robabiqu36ocm 100%[===================>]   8.48M  5.14MB/s    in 1.6s    \n",
      "\n",
      "2018-11-28 10:14:26 (5.14 MB/s) - ‘4r4tf2robabiqu36ocmykrzvojuse5k9.mp4.6’ saved [8887512/8887512]\n",
      "\n"
     ]
    }
   ],
   "source": [
    "!wget {input_video_url}\n",
    "input_video = input_video_url.split('/')[-1]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Create or clean the directories\n",
    "Caching the frames and output directories allows the processing to continue where it left off. This is particularly useful when using a shared system with deployment time limits. This also allows you to quickly `Run all` when tweaking Python code that does not affect the inference.\n",
    "\n",
    "If you change the input video or just want a fresh start, you should `CLEAN` or change the directory names."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [],
   "source": [
    "if CLEAN:\n",
    "    if os.path.isdir(FRAMES_DIR):\n",
    "        shutil.rmtree(FRAMES_DIR)\n",
    "    if os.path.isdir(OUTPUT_DIR):\n",
    "        shutil.rmtree(OUTPUT_DIR)\n",
    "\n",
    "if not os.path.isdir(FRAMES_DIR):\n",
    "    os.mkdir(FRAMES_DIR)\n",
    "if not os.path.isdir(OUTPUT_DIR):\n",
    "    os.mkdir(OUTPUT_DIR)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Parse and explode the video file into JPEGs\n",
    "Each frame is saved as an individual JPEG file for later use."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Frame count estimate is 1769\n",
      "Writing frame 1769 of 1769\n",
      "Wrote 1769 frames\n",
      "Frame Dimensions: 960x540\n"
     ]
    }
   ],
   "source": [
    "if os.path.isfile(input_video):\n",
    "    video_capture = cv2.VideoCapture(input_video)\n",
    "else:\n",
    "    raise Exception(\"File %s doesn't exist!\" % input_video)\n",
    "\n",
    "total_frames = int(video_capture.get(cv2.CAP_PROP_FRAME_COUNT))\n",
    "print(\"Frame count estimate is %d\" % total_frames)\n",
    "\n",
    "num = 0\n",
    "while video_capture.get(cv2.CAP_PROP_POS_FRAMES) < video_capture.get(cv2.CAP_PROP_FRAME_COUNT):\n",
    "    success, image = video_capture.read()\n",
    "    if success:\n",
    "        num = int(video_capture.get(cv2.CAP_PROP_POS_FRAMES))\n",
    "        print(\"Writing frame {num} of {total_frames}\".format(\n",
    "            num=num, total_frames=total_frames), end=\"\\r\")\n",
    "        cv2.imwrite('{frames_dir}/frame_{num:05d}.jpg'.format(\n",
    "            frames_dir=FRAMES_DIR, num=num), image)\n",
    "    else:\n",
    "        # TODO: If this happens, we need to add retry code\n",
    "        raise Exception('Error writing frame_{num:05d}.jpg'.format(\n",
    "            num=int(video_capture.get(cv2.CAP_PROP_POS_FRAMES))))\n",
    "\n",
    "print(\"\\nWrote {num} frames\".format(num=num))\n",
    "\n",
    "FRAME_FPS = int(video_capture.get(cv2.CAP_PROP_FPS))\n",
    "FRAME_WIDTH = int(video_capture.get(cv2.CAP_PROP_FRAME_WIDTH))\n",
    "FRAME_HEIGHT = int(video_capture.get(cv2.CAP_PROP_FRAME_HEIGHT))\n",
    "ROI_YMAX = int(round(FRAME_HEIGHT * 0.75))  # Bottom quarter = finish line\n",
    "\n",
    "print(\"Frame Dimensions: %sx%s\" % (FRAME_WIDTH, FRAME_HEIGHT))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## PowerAI Vision inference wrapper\n",
    "Define a helper/wrapper to call PowerAI Vision and return the inference result."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "s = requests.Session()\n",
    "\n",
    "\n",
    "def detect_objects(filename):\n",
    "\n",
    "    with open(filename, 'rb') as f:\n",
    "        # WARNING! verify=False is here to allow an untrusted cert!\n",
    "        r = s.post(POWER_AI_VISION_API_URL,\n",
    "                   files={'files': (filename, f)},\n",
    "                   verify=False)\n",
    "\n",
    "    return r.status_code, json.loads(r.text)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Test the API on a single frame\n",
    "Let's look at the result of a single inference operation from the PowerAI Vision Object Detection API. We see a standard HTTP return code, and a JSON response which includes the image URL, and tuples that indicate the confidence and bounding-box coordinates of the objects that we classified."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "rc = 200\n",
      "jsonresp: {'imageUrl': 'http://ny1.ptopenlab.com:443/AIVision/uploads/temp/ec883228-530d-47cb-b081-14c8a3606578/2366f90b-a3ee-4443-85cf-9ca1f050651b.jpg', 'imageMd5': '281c4c3836f8fd761efc867be7fc7d10', 'classified': [{'confidence': 0.9998700618743896, 'ymax': 368, 'label': 'car', 'xmax': 506, 'xmin': 377, 'ymin': 252, 'attr': []}, {'confidence': 0.9998486042022705, 'ymax': 341, 'label': 'car', 'xmax': 747, 'xmin': 618, 'ymin': 233, 'attr': []}, {'confidence': 0.9997749924659729, 'ymax': 275, 'label': 'car', 'xmax': 412, 'xmin': 299, 'ymin': 185, 'attr': []}, {'confidence': 0.999502420425415, 'ymax': 249, 'label': 'car', 'xmax': 587, 'xmin': 487, 'ymin': 163, 'attr': []}, {'confidence': 0.998431384563446, 'ymax': 177, 'label': 'car', 'xmax': 256, 'xmin': 180, 'ymin': 117, 'attr': []}, {'confidence': 0.9936187267303467, 'ymax': 198, 'label': 'car', 'xmax': 428, 'xmin': 357, 'ymin': 119, 'attr': []}, {'confidence': 0.9926624298095703, 'ymax': 178, 'label': 'car', 'xmax': 315, 'xmin': 246, 'ymin': 128, 'attr': []}], 'result': 'success'}\n",
      "Got back 7 objects\n",
      "{\n",
      "  \"imageUrl\": \"http://ny1.ptopenlab.com:443/AIVision/uploads/temp/ec883228-530d-47cb-b081-14c8a3606578/2366f90b-a3ee-4443-85cf-9ca1f050651b.jpg\",\n",
      "  \"imageMd5\": \"281c4c3836f8fd761efc867be7fc7d10\",\n",
      "  \"classified\": [\n",
      "    {\n",
      "      \"confidence\": 0.9998700618743896,\n",
      "      \"ymax\": 368,\n",
      "      \"label\": \"car\",\n",
      "      \"xmax\": 506,\n",
      "      \"xmin\": 377,\n",
      "      \"ymin\": 252,\n",
      "      \"attr\": []\n",
      "    },\n",
      "    {\n",
      "      \"confidence\": 0.9998486042022705,\n",
      "      \"ymax\": 341,\n",
      "      \"label\": \"car\",\n",
      "      \"xmax\": 747,\n",
      "      \"xmin\": 618,\n",
      "      \"ymin\": 233,\n",
      "      \"attr\": []\n",
      "    },\n",
      "    {\n",
      "      \"confidence\": 0.9997749924659729,\n",
      "      \"ymax\": 275,\n",
      "      \"label\": \"car\",\n",
      "      \"xmax\": 412,\n",
      "      \"xmin\": 299,\n",
      "      \"ymin\": 185,\n",
      "      \"attr\": []\n",
      "    },\n",
      "    {\n",
      "      \"confidence\": 0.999502420425415,\n",
      "      \"ymax\": 249,\n",
      "      \"label\": \"car\",\n",
      "      \"xmax\": 587,\n",
      "      \"xmin\": 487,\n",
      "      \"ymin\": 163,\n",
      "      \"attr\": []\n",
      "    },\n",
      "    {\n",
      "      \"confidence\": 0.998431384563446,\n",
      "      \"ymax\": 177,\n",
      "      \"label\": \"car\",\n",
      "      \"xmax\": 256,\n",
      "      \"xmin\": 180,\n",
      "      \"ymin\": 117,\n",
      "      \"attr\": []\n",
      "    },\n",
      "    {\n",
      "      \"confidence\": 0.9936187267303467,\n",
      "      \"ymax\": 198,\n",
      "      \"label\": \"car\",\n",
      "      \"xmax\": 428,\n",
      "      \"xmin\": 357,\n",
      "      \"ymin\": 119,\n",
      "      \"attr\": []\n",
      "    },\n",
      "    {\n",
      "      \"confidence\": 0.9926624298095703,\n",
      "      \"ymax\": 178,\n",
      "      \"label\": \"car\",\n",
      "      \"xmax\": 315,\n",
      "      \"xmin\": 246,\n",
      "      \"ymin\": 128,\n",
      "      \"attr\": []\n",
      "    }\n",
      "  ],\n",
      "  \"result\": \"success\"\n",
      "}\n"
     ]
    }
   ],
   "source": [
    "rc, jsonresp = detect_objects('frames/frame_00100.jpg')\n",
    "\n",
    "print(\"rc = %d\" % rc)\n",
    "print(\"jsonresp: %s\" % jsonresp)\n",
    "if 'classified' in jsonresp:\n",
    "    print(\"Got back %d objects\" % len(jsonresp['classified']))\n",
    "print(json.dumps(jsonresp, indent=2))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Get object detection results for sampled frames\n",
    "Since we've stored all video frames on disk (for easy reference), we can iterate over those files\n",
    "and make queries as appropriate to PowerAI Vision's API. We'll store the results in a\n",
    "`tracking_results` dictionary, organized by file name. Since we are tracking objects from frame\n",
    "to frame, we can use sampling to decide how often to check for new objects.\n",
    "\n",
    "We're also caching the results so that you can change later code and run the notebook over\n",
    "without running the same inference over again."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Sampling every 10th frame\n",
      "Processed file 10 of 1769 (used cache 1 times)\r",
      "Processed file 20 of 1769 (used cache 2 times)\r",
      "Processed file 30 of 1769 (used cache 3 times)\r",
      "Processed file 40 of 1769 (used cache 4 times)\r",
      "Processed file 50 of 1769 (used cache 5 times)\r",
      "Processed file 60 of 1769 (used cache 6 times)\r",
      "Processed file 70 of 1769 (used cache 7 times)\r",
      "Processed file 80 of 1769 (used cache 8 times)\r",
      "Processed file 90 of 1769 (used cache 9 times)\r",
      "Processed file 100 of 1769 (used cache 10 times)\r",
      "Processed file 110 of 1769 (used cache 11 times)\r",
      "Processed file 120 of 1769 (used cache 12 times)\r",
      "Processed file 130 of 1769 (used cache 13 times)\r",
      "Processed file 140 of 1769 (used cache 14 times)\r",
      "Processed file 150 of 1769 (used cache 15 times)\r",
      "Processed file 160 of 1769 (used cache 16 times)\r",
      "Processed file 170 of 1769 (used cache 17 times)\r",
      "Processed file 180 of 1769 (used cache 18 times)\r",
      "Processed file 190 of 1769 (used cache 19 times)\r",
      "Processed file 200 of 1769 (used cache 20 times)\r",
      "Processed file 210 of 1769 (used cache 21 times)\r",
      "Processed file 220 of 1769 (used cache 22 times)\r",
      "Processed file 230 of 1769 (used cache 23 times)\r",
      "Processed file 240 of 1769 (used cache 24 times)\r",
      "Processed file 250 of 1769 (used cache 25 times)\r",
      "Processed file 260 of 1769 (used cache 26 times)\r",
      "Processed file 270 of 1769 (used cache 27 times)\r",
      "Processed file 280 of 1769 (used cache 28 times)\r",
      "Processed file 290 of 1769 (used cache 29 times)\r",
      "Processed file 300 of 1769 (used cache 30 times)\r",
      "Processed file 310 of 1769 (used cache 31 times)\r",
      "Processed file 320 of 1769 (used cache 32 times)\r",
      "Processed file 330 of 1769 (used cache 33 times)\r",
      "Processed file 340 of 1769 (used cache 34 times)\r",
      "Processed file 350 of 1769 (used cache 35 times)\r",
      "Processed file 360 of 1769 (used cache 36 times)\r",
      "Processed file 370 of 1769 (used cache 37 times)\r",
      "Processed file 380 of 1769 (used cache 38 times)\r",
      "Processed file 390 of 1769 (used cache 39 times)\r",
      "Processed file 400 of 1769 (used cache 40 times)\r",
      "Processed file 410 of 1769 (used cache 41 times)\r",
      "Processed file 420 of 1769 (used cache 42 times)\r",
      "Processed file 430 of 1769 (used cache 43 times)\r",
      "Processed file 440 of 1769 (used cache 44 times)\r",
      "Processed file 450 of 1769 (used cache 45 times)\r",
      "Processed file 460 of 1769 (used cache 46 times)\r",
      "Processed file 470 of 1769 (used cache 47 times)\r",
      "Processed file 480 of 1769 (used cache 48 times)\r",
      "Processed file 490 of 1769 (used cache 49 times)\r",
      "Processed file 500 of 1769 (used cache 50 times)\r",
      "Processed file 510 of 1769 (used cache 51 times)\r",
      "Processed file 520 of 1769 (used cache 52 times)\r",
      "Processed file 530 of 1769 (used cache 53 times)\r",
      "Processed file 540 of 1769 (used cache 54 times)\r",
      "Processed file 550 of 1769 (used cache 55 times)\r",
      "Processed file 560 of 1769 (used cache 56 times)\r",
      "Processed file 570 of 1769 (used cache 57 times)\r",
      "Processed file 580 of 1769 (used cache 58 times)\r",
      "Processed file 590 of 1769 (used cache 59 times)\r",
      "Processed file 600 of 1769 (used cache 60 times)\r",
      "Processed file 610 of 1769 (used cache 61 times)\r",
      "Processed file 620 of 1769 (used cache 62 times)\r",
      "Processed file 630 of 1769 (used cache 63 times)\r",
      "Processed file 640 of 1769 (used cache 64 times)\r",
      "Processed file 650 of 1769 (used cache 65 times)\r",
      "Processed file 660 of 1769 (used cache 66 times)\r",
      "Processed file 670 of 1769 (used cache 67 times)\r",
      "Processed file 680 of 1769 (used cache 68 times)\r",
      "Processed file 690 of 1769 (used cache 69 times)\r",
      "Processed file 700 of 1769 (used cache 70 times)\r",
      "Processed file 710 of 1769 (used cache 71 times)\r",
      "Processed file 720 of 1769 (used cache 72 times)\r",
      "Processed file 730 of 1769 (used cache 73 times)\r",
      "Processed file 740 of 1769 (used cache 74 times)\r",
      "Processed file 750 of 1769 (used cache 75 times)\r",
      "Processed file 760 of 1769 (used cache 76 times)\r",
      "Processed file 770 of 1769 (used cache 77 times)\r",
      "Processed file 780 of 1769 (used cache 78 times)\r",
      "Processed file 790 of 1769 (used cache 79 times)\r",
      "Processed file 800 of 1769 (used cache 80 times)\r",
      "Processed file 810 of 1769 (used cache 81 times)\r",
      "Processed file 820 of 1769 (used cache 82 times)\r",
      "Processed file 830 of 1769 (used cache 83 times)\r",
      "Processed file 840 of 1769 (used cache 84 times)\r",
      "Processed file 850 of 1769 (used cache 85 times)\r",
      "Processed file 860 of 1769 (used cache 86 times)\r",
      "Processed file 870 of 1769 (used cache 87 times)\r",
      "Processed file 880 of 1769 (used cache 88 times)\r",
      "Processed file 890 of 1769 (used cache 89 times)\r",
      "Processed file 900 of 1769 (used cache 90 times)\r",
      "Processed file 910 of 1769 (used cache 91 times)\r",
      "Processed file 920 of 1769 (used cache 92 times)\r",
      "Processed file 930 of 1769 (used cache 93 times)\r",
      "Processed file 940 of 1769 (used cache 94 times)\r",
      "Processed file 950 of 1769 (used cache 95 times)\r",
      "Processed file 960 of 1769 (used cache 96 times)\r",
      "Processed file 970 of 1769 (used cache 97 times)\r",
      "Processed file 980 of 1769 (used cache 98 times)\r",
      "Processed file 990 of 1769 (used cache 99 times)\r",
      "Processed file 1000 of 1769 (used cache 100 times)\r",
      "Processed file 1010 of 1769 (used cache 101 times)\r",
      "Processed file 1020 of 1769 (used cache 102 times)\r",
      "Processed file 1030 of 1769 (used cache 103 times)\r",
      "Processed file 1040 of 1769 (used cache 104 times)\r",
      "Processed file 1050 of 1769 (used cache 105 times)\r",
      "Processed file 1060 of 1769 (used cache 106 times)\r",
      "Processed file 1070 of 1769 (used cache 107 times)\r",
      "Processed file 1080 of 1769 (used cache 108 times)\r",
      "Processed file 1090 of 1769 (used cache 109 times)\r",
      "Processed file 1100 of 1769 (used cache 110 times)\r",
      "Processed file 1110 of 1769 (used cache 111 times)\r",
      "Processed file 1120 of 1769 (used cache 112 times)\r",
      "Processed file 1130 of 1769 (used cache 113 times)\r",
      "Processed file 1140 of 1769 (used cache 114 times)\r",
      "Processed file 1150 of 1769 (used cache 115 times)\r",
      "Processed file 1160 of 1769 (used cache 116 times)\r",
      "Processed file 1170 of 1769 (used cache 117 times)\r",
      "Processed file 1180 of 1769 (used cache 118 times)\r",
      "Processed file 1190 of 1769 (used cache 119 times)\r",
      "Processed file 1200 of 1769 (used cache 120 times)\r",
      "Processed file 1210 of 1769 (used cache 121 times)\r",
      "Processed file 1220 of 1769 (used cache 122 times)\r",
      "Processed file 1230 of 1769 (used cache 123 times)\r",
      "Processed file 1240 of 1769 (used cache 124 times)\r",
      "Processed file 1250 of 1769 (used cache 125 times)\r",
      "Processed file 1260 of 1769 (used cache 126 times)\r",
      "Processed file 1270 of 1769 (used cache 127 times)\r",
      "Processed file 1280 of 1769 (used cache 128 times)\r",
      "Processed file 1290 of 1769 (used cache 129 times)\r",
      "Processed file 1300 of 1769 (used cache 130 times)\r",
      "Processed file 1310 of 1769 (used cache 131 times)\r",
      "Processed file 1320 of 1769 (used cache 132 times)\r",
      "Processed file 1330 of 1769 (used cache 133 times)\r",
      "Processed file 1340 of 1769 (used cache 134 times)\r",
      "Processed file 1350 of 1769 (used cache 135 times)\r",
      "Processed file 1360 of 1769 (used cache 136 times)\r",
      "Processed file 1370 of 1769 (used cache 137 times)\r",
      "Processed file 1380 of 1769 (used cache 138 times)\r",
      "Processed file 1390 of 1769 (used cache 139 times)\r",
      "Processed file 1400 of 1769 (used cache 140 times)\r",
      "Processed file 1410 of 1769 (used cache 141 times)\r",
      "Processed file 1420 of 1769 (used cache 142 times)\r",
      "Processed file 1430 of 1769 (used cache 143 times)\r",
      "Processed file 1440 of 1769 (used cache 144 times)\r",
      "Processed file 1450 of 1769 (used cache 145 times)\r",
      "Processed file 1460 of 1769 (used cache 146 times)\r",
      "Processed file 1470 of 1769 (used cache 147 times)\r",
      "Processed file 1480 of 1769 (used cache 148 times)\r",
      "Processed file 1490 of 1769 (used cache 149 times)\r",
      "Processed file 1500 of 1769 (used cache 150 times)\r",
      "Processed file 1510 of 1769 (used cache 151 times)\r",
      "Processed file 1520 of 1769 (used cache 152 times)\r",
      "Processed file 1530 of 1769 (used cache 153 times)\r",
      "Processed file 1540 of 1769 (used cache 154 times)\r",
      "Processed file 1550 of 1769 (used cache 155 times)\r",
      "Processed file 1560 of 1769 (used cache 156 times)\r",
      "Processed file 1570 of 1769 (used cache 157 times)\r",
      "Processed file 1580 of 1769 (used cache 158 times)\r",
      "Processed file 1590 of 1769 (used cache 159 times)\r",
      "Processed file 1600 of 1769 (used cache 160 times)\r",
      "Processed file 1610 of 1769 (used cache 161 times)\r",
      "Processed file 1620 of 1769 (used cache 162 times)\r",
      "Processed file 1630 of 1769 (used cache 163 times)\r",
      "Processed file 1640 of 1769 (used cache 164 times)\r",
      "Processed file 1650 of 1769 (used cache 165 times)\r",
      "Processed file 1660 of 1769 (used cache 166 times)\r",
      "Processed file 1670 of 1769 (used cache 167 times)\r",
      "Processed file 1680 of 1769 (used cache 168 times)\r",
      "Processed file 1690 of 1769 (used cache 169 times)\r",
      "Processed file 1700 of 1769 (used cache 170 times)\r",
      "Processed file 1710 of 1769 (used cache 171 times)\r",
      "Processed file 1720 of 1769 (used cache 172 times)\r",
      "Processed file 1730 of 1769 (used cache 173 times)\r",
      "Processed file 1740 of 1769 (used cache 174 times)\r",
      "Processed file 1750 of 1769 (used cache 175 times)\r",
      "Processed file 1760 of 1769 (used cache 176 times)\r\n",
      "Done\n"
     ]
    }
   ],
   "source": [
    "# Serialize requests, storing them in a \"tracking_results\" dict\n",
    "\n",
    "try:\n",
    "    with open('frames/frame-data-newmodel.json') as existing_results:\n",
    "        tracking_results = json.load(existing_results)\n",
    "except Exception:\n",
    "    # Any fail to read existing results means we start over\n",
    "    tracking_results = {}\n",
    "\n",
    "print(\"Sampling every %sth frame\" % SAMPLING)\n",
    "i = 0\n",
    "cache_used = 0\n",
    "sampled = 0\n",
    "for filename in sorted(glob.glob('frames/frame_*.jpg')):\n",
    "    i += 1\n",
    "\n",
    "    if not i % SAMPLING == 0:  # Sample every Nth\n",
    "        continue\n",
    "\n",
    "    existing_result = tracking_results.get(filename)\n",
    "    if existing_result and existing_result['result'] == 'success':\n",
    "        cache_used += 1\n",
    "    else:\n",
    "        rc, results = detect_objects(filename)\n",
    "        if rc != 200 or results['result'] != 'success':\n",
    "            print(\"ERROR rc=%d for %s\" % (rc, filename))\n",
    "            print(\"ERROR result=%s\" % results)\n",
    "        else:\n",
    "            sampled += 1\n",
    "            # Save frequently to cache partial results\n",
    "            tracking_results[filename] = results\n",
    "            with open('frames/frame-data-newmodel.json', 'w') as fp:\n",
    "                json.dump(tracking_results, fp)\n",
    "\n",
    "    print(\"Processed file {num} of {total_frames} (used cache {cache_used} times)\".format(\n",
    "        num=i, total_frames=total_frames, cache_used=cache_used), end=\"\\r\")\n",
    "\n",
    "# Finally, write all our results\n",
    "with open('frames/frame-data-newmodel.json', 'w') as fp:\n",
    "    json.dump(tracking_results, fp)\n",
    "\n",
    "print(\"\\nDone\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Define helper functions for tracking and drawing labels\n",
    "Refer to the [OpenCV docs.](https://docs.opencv.org/3.4.1/)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [],
   "source": [
    "def label_object(color, textcolor, fontface, image, car, textsize, thickness, xmax, xmid, xmin, ymax, ymid, ymin):\n",
    "    cv2.rectangle(image, (xmin, ymin), (xmax, ymax), color, thickness)\n",
    "    pos = (xmid - textsize[0]//2, ymid + textsize[1]//2)\n",
    "    cv2.putText(image, car, pos, fontface, 1, textcolor, thickness, cv2.LINE_AA)\n",
    "\n",
    "\n",
    "def update_trackers(image, counters):\n",
    "    left_lane = counters['left_lane']\n",
    "    right_lane = counters['right_lane']\n",
    "    boxes = []\n",
    "    color = (80, 220, 60)\n",
    "    fontface = cv2.FONT_HERSHEY_SIMPLEX\n",
    "    fontscale = 1\n",
    "    thickness = 1\n",
    "\n",
    "    for n, pair in enumerate(trackers):\n",
    "        tracker, car = pair\n",
    "        textsize, _baseline = cv2.getTextSize(\n",
    "            car, fontface, fontscale, thickness)\n",
    "        success, bbox = tracker.update(image)\n",
    "\n",
    "        if not success:\n",
    "            counters['lost_trackers'] += 1\n",
    "            del trackers[n]\n",
    "            continue\n",
    "\n",
    "        boxes.append(bbox)  # Return updated box list\n",
    "\n",
    "        xmin = int(bbox[0])\n",
    "        ymin = int(bbox[1])\n",
    "        xmax = int(bbox[0] + bbox[2])\n",
    "        ymax = int(bbox[1] + bbox[3])\n",
    "        xmid = int(round((xmin+xmax)/2))\n",
    "        ymid = int(round((ymin+ymax)/2))\n",
    "\n",
    "        if ymid >= ROI_YMAX:\n",
    "            label_object(WHITE, WHITE, fontface, image, car, textsize, 1, xmax, xmid, xmin, ymax, ymid, ymin)\n",
    "            # Count left-lane, right-lane as cars ymid crosses finish line\n",
    "            if xmid < 630:\n",
    "                left_lane += 1\n",
    "            else:\n",
    "                right_lane += 1\n",
    "            # Stop tracking cars when they hit finish line\n",
    "            del trackers[n]\n",
    "        else:\n",
    "            # Rectangle and number on the cars we are tracking\n",
    "            label_object(color, YELLOW, fontface, image, car, textsize, 4, xmax, xmid, xmin, ymax, ymid, ymin)\n",
    "\n",
    "    # Add finish line overlay/line\n",
    "    overlay = image.copy()\n",
    "\n",
    "    # Shade region of interest (ROI). We're really just using the top line.\n",
    "    cv2.rectangle(overlay,\n",
    "                  (0, ROI_YMAX),\n",
    "                  (FRAME_WIDTH, FRAME_HEIGHT), DARK_BLUE, cv2.FILLED)\n",
    "    cv2.addWeighted(overlay, 0.6, image, 0.4, 0, image)\n",
    "\n",
    "    # Draw start line, if > 0\n",
    "    if START_LINE > 0:\n",
    "        cv2.line(image, (0, START_LINE), (FRAME_WIDTH, START_LINE), GRAY, 4, cv2.LINE_AA)\n",
    "    # Draw finish line with lane hash marks\n",
    "    cv2.line(image, (0, ROI_YMAX), (FRAME_WIDTH, ROI_YMAX), LIGHT_CYAN, 4, cv2.LINE_AA)\n",
    "    cv2.line(image, (350, ROI_YMAX - 20), (350, ROI_YMAX + 20), LIGHT_CYAN, 4, cv2.LINE_AA)\n",
    "    cv2.line(image, (630, ROI_YMAX - 20), (630, ROI_YMAX + 20), LIGHT_CYAN, 4, cv2.LINE_AA)\n",
    "    cv2.line(image, (950, ROI_YMAX - 20), (950, ROI_YMAX + 20), LIGHT_CYAN, 4, cv2.LINE_AA)\n",
    "\n",
    "    # Add lane counter\n",
    "    cv2.putText(image, \"Lane counter:\", (30, ROI_YMAX + 80), fontface, 1.5, LIGHT_CYAN, 4, cv2.LINE_AA)\n",
    "    cv2.putText(image, str(left_lane), (480, ROI_YMAX + 80), fontface, 1.5, LIGHT_CYAN, 4, cv2.LINE_AA)\n",
    "    cv2.putText(image, str(right_lane), (800, ROI_YMAX + 80), fontface, 1.5, LIGHT_CYAN, 4, cv2.LINE_AA)\n",
    "    seconds = counters['frames'] / FRAME_FPS\n",
    "    cv2.putText(image, \"Cars/second:\", (35, ROI_YMAX + 110), fontface, 0.5, LIGHT_CYAN, 1, cv2.LINE_AA)\n",
    "    cv2.putText(image, '{0:.2f}'.format(left_lane / seconds), (480, ROI_YMAX + 110), fontface, 0.5, LIGHT_CYAN, 1, cv2.LINE_AA)\n",
    "    cv2.putText(image, '{0:.2f}'.format(right_lane / seconds), (800, ROI_YMAX + 110), fontface, 0.5, LIGHT_CYAN, 1, cv2.LINE_AA)\n",
    "\n",
    "    counters['left_lane'] = left_lane\n",
    "    counters['right_lane'] = right_lane\n",
    "    return boxes, counters\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [],
   "source": [
    "def not_tracked(objects, boxes):\n",
    "    if not objects:\n",
    "        return []  # No new classified objects to search for\n",
    "    if not boxes:\n",
    "        return objects  # No existing boxes, return all objects\n",
    "\n",
    "    new_objects = []\n",
    "    for obj in objects:\n",
    "        ymin = obj.get(\"ymin\", \"\")\n",
    "        ymax = obj.get(\"ymax\", \"\")\n",
    "        ymid = int(round((ymin+ymax)/2))\n",
    "        xmin = obj.get(\"xmin\", \"\")\n",
    "        xmax = obj.get(\"xmax\", \"\")\n",
    "        xmid = int(round((xmin+xmax)/2))\n",
    "        box_range = ((xmax - xmin) + (ymax - ymin)) / 2\n",
    "        for bbox in boxes:\n",
    "            bxmin = int(bbox[0])\n",
    "            bymin = int(bbox[1])\n",
    "            bxmax = int(bbox[0] + bbox[2])\n",
    "            bymax = int(bbox[1] + bbox[3])\n",
    "            bxmid = int((bxmin + bxmax) / 2)\n",
    "            bymid = int((bymin + bymax) / 2)\n",
    "            if math.sqrt((xmid - bxmid)**2 + (ymid - bymid)**2) < box_range:\n",
    "                # found existing, so break (do not add to new_objects)\n",
    "                break\n",
    "        else:\n",
    "            new_objects.append(obj)\n",
    "\n",
    "    return new_objects\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [],
   "source": [
    "def in_range(obj):\n",
    "    ymin = obj['ymin']\n",
    "    ymax = obj['ymax']\n",
    "    if ymin < START_LINE or ymax > ROI_YMAX:\n",
    "        # Don't add new trackers before start or after finish.\n",
    "        # Start line can help avoid overlaps and tracker loss.\n",
    "        # Finish line protection avoids counting the car twice.\n",
    "        return False\n",
    "    return True\n",
    "    \n",
    "def add_new_object(obj, image, cars):\n",
    "    car = str(cars)\n",
    "    xmin = obj['xmin']\n",
    "    xmax = obj['xmax']\n",
    "    ymin = obj['ymin']\n",
    "    ymax = obj['ymax']\n",
    "    xmid = int(round((xmin+xmax)/2))\n",
    "    ymid = int(round((ymin+ymax)/2))\n",
    "    fontface = cv2.FONT_HERSHEY_SIMPLEX\n",
    "    fontscale = 1\n",
    "    thickness = 1\n",
    "    textsize, _baseline = cv2.getTextSize(\n",
    "        car, fontface, fontscale, thickness)\n",
    "\n",
    "    # init tracker\n",
    "    tracker = cv2.TrackerKCF_create()  # Note: Try comparing KCF with MIL\n",
    "    success = tracker.init(image, (xmin, ymin, xmax-xmin, ymax-ymin))\n",
    "    if success:\n",
    "        trackers.append((tracker, car))\n",
    "\n",
    "    label_object(GREEN, YELLOW, fontface, image, car, textsize, 4, xmax, xmid, xmin, ymax, ymid, ymin)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Inference, tracking, and annotation\n",
    "Loop through the saved frames and:\n",
    "1. Update the trackers to follow already detected objects from frame to frame.\n",
    "1. Look for new objects if we ran inference on this frame.\n",
    "    * Check for overlap with tracked objects.\n",
    "    * If no overlap, assign a sequence number and start tracking.\n",
    "1. Write an annotated image with tracked objects highlighted and numbered."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Processed file 1769 of 1769\n",
      "Done\n"
     ]
    }
   ],
   "source": [
    "cars = 0\n",
    "trackers = []\n",
    "counters = {\n",
    "    'left_lane':  0,\n",
    "    'right_lane':  0,\n",
    "    'lost_trackers': 0,\n",
    "    'frames': 0,\n",
    "}\n",
    "\n",
    "with open('frames/frame-data-newmodel.json') as existing_results:\n",
    "    tracking_results = json.load(existing_results)\n",
    "\n",
    "for filename in sorted(glob.glob('frames/frame_*.jpg')):\n",
    "    counters['frames'] += 1\n",
    "    img = cv2.imread(filename)\n",
    "    boxes, counters = update_trackers(img, counters)\n",
    "\n",
    "    if filename in tracking_results and 'classified' in tracking_results[filename]:\n",
    "        jsonresp = tracking_results[filename]\n",
    "        for obj in not_tracked(jsonresp['classified'], boxes):\n",
    "            if in_range(obj):\n",
    "                cars += 1\n",
    "                add_new_object(obj, img, cars)  # Label and start tracking\n",
    "\n",
    "    # Draw the running total of cars in the image in the upper-left corner\n",
    "    cv2.putText(img, 'Cars detected: ' + str(cars), (30, 60),\n",
    "                cv2.FONT_HERSHEY_SIMPLEX, 1.5, DARK_BLUE, 4, cv2.LINE_AA)\n",
    "    # Add note with count of trackers lost\n",
    "    cv2.putText(img, 'Cars lost: ' + str(counters['lost_trackers']), (35, 85),\n",
    "                cv2.FONT_HERSHEY_SIMPLEX, 0.5, DARK_BLUE, 1, cv2.LINE_AA)\n",
    "\n",
    "    cv2.imwrite(\"output/output-\" + filename.split('/')[1], img)\n",
    "    print(\"Processed file {num} of {total_frames}\".format(\n",
    "        num=counters['frames'], total_frames=total_frames), end=\"\\r\")\n",
    "\n",
    "print(\"\\nDone\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Play the annotated frames in the notebook\n",
    "\n",
    "This code will play the annotated frames in a loop to demonstrate the new video.\n",
    "Running this in the notebook is usually slow. Shrinking the size helps some.\n",
    "Refer to the following section to build a real, full speed video."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Done\n"
     ]
    }
   ],
   "source": [
    "for filename in sorted(glob.glob(os.path.join(os.path.abspath(OUTPUT_DIR),\n",
    "                                              'output-frame_*.jpg'))):\n",
    "    frame = cv2.imread(filename)\n",
    "    clear_output(wait=True)\n",
    "    rows, columns, _channels = frame.shape\n",
    "    frame = cv2.resize(frame, (int(columns/2), int(rows/2)))  # shrink it\n",
    "    _ret, jpg = cv2.imencode('.jpg', frame)\n",
    "    display(Image(data=jpg))\n",
    "\n",
    "print(\"\\nDone\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Create a video from the annotated frames\n",
    "\n",
    "This command requires `ffmpeg`. It will combine the annotated\n",
    "frames to build an MP4 video which you can play at full speed\n",
    "(the notebook playback above was most likely slow).\n",
    "\n",
    "Uncomment the command to try running it from this notebook, or\n",
    "copy the output files to a system with `ffmpeg` and run the\n",
    "command there.\n",
    "\n",
    "> NOTE: The command below requires libx264 for encoding video\n",
    "stream into the H.264/MPEG-4 AVC compression format. Please \n",
    "check that `ffmpeg` was configured and built with `--enable-libx264`\n",
    "(`ffmpeg 2>&1 | grep libx264`).\n",
    "If not, just remove the `-vcodec libx264` option from the\n",
    "following command."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [],
   "source": [
    "# !ffmpeg -y -r 60 -f image2 -i output/output-frame_%05d.jpg -vcodec libx264 -crf 25  -pix_fmt yuvj420p annotated_video.mp4\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
